perm filename SEC.SAI[DIA,KMC]4 blob
sn#166700 filedate 1975-07-01 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00011 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 BEGIN
C00010 00003 D ROUTINE FOR DELETING DIA FILES
C00017 00004 S ROUTINE FOR FOR GOING THRU DIA FILES AND COLLECTING NET STATS
C00022 00005 U ROUTINE FOR GOING THRU SOR AND TOPICS FOR UNUSED
C00024 00006 I ROUTINE FOR GETTING THE IMPORTANT STUFF FROM PDAT
C00029 00007 C ROUTINE FOR GETTING A LIST OF TOPICS FROM PDAT
C00031 00008 P ROUTINE FOR FOR GOING THRU DIA FILES
C00038 00009 A ROUTINE FOR REPLACING PRONOUNS BY "THEY"
C00040 00010 G ROUTINE FOR APPENDING FILES
C00042 00011 B ROUTINE FOR SPECIAL MOD: PUTS IN BLANK LINES
C00048 ENDMK
C⊗;
BEGIN
REQUIRE "IODEFS[1,BLF]" SOURCE_FILE;
DEFINE ITT(X,N) = "FOR X←1 STEP 1 UNTIL N DO";
DEFINE ∂=" &BLANK1& ";
STRING BLANK1,BLANK10,BLANK20,DELIMSS,FORMFEED;
INTEGER DICE, SW, P, P1, Q, Q1, I, I1, J, J1, K, K1, W, L, T, WFLAG;
INTEGER NEXTL,NEXTA,LI,SSLEN,ATLEN,ERROR,IDUM,INCH1,INCH2,EOF1,EOF2;
REAL R, RR, RRR;
STRING S, SS, SSS,ST,SY,SV,FILENAME,SU,LASTNAME,LASTLINE,ZEROKS,TOPIC,LASTB,AREA;
STRING S1,S2;
PRELOAD_WITH [11] 0;
INTEGER ARRAY AA[1:11];
STRING ARRAY SA[1:15];
INTEGER ARRAY DUMMAA[1:6,1:3];
STRING PROC RIGHTZ(INTEGER L; STRING S);
RETURN(IF LN(S)<L THEN ZEROKS[1 TO L-LN(S)]&S ELSE S[1 TO L]);
STRING PROC OFFS(STRING S; INTEGER I);
BEGIN STRING ST; INTEGER L; L←LENGTH(S);
IF I<L THEN ST←S[I+1 TO L] ELSE ST←NULL; RETURN (ST) ; END;
BOOLEAN PROC EQS(STRING S);
RETURN(IF EQU(S,NULL) OR EQU(S," ") THEN TRUE ELSE FALSE);
STRING PROC READIN(INTEGER CHAN);
BEGIN STRING S; S←INPUT(CHAN,1);
WHILE ¬EOF AND EQS(S) DO S←INPUT(CHAN,1);
IF EOF THEN IF CHAN=INCH1 THEN EOF1←EOF ELSE EOF2←EOF; RETURN(S); END;
PROC OUTB(INTEGER CHAN; STRING S);
BEGIN IF ¬EQU(SV,S[1 TO 6]) THEN BEGIN OUT(OUCH, NULL ↓ ); SV←S[1 TO 6]; END;
OUT(OUCH, S); END;
STRING PROC READNOC(INTEGER I);
BEGIN STRING S,SDUM; INTEGER FLAG; FLAG←0;
WHILE ¬EOF AND ¬EOF1 AND ¬EOF2 AND FLAG=0 DO BEGIN S←READIN(I);
IF EQU(S[1 TO 1],FORMFEED) THEN SDUM←LOP(S);
IF EQU(S[1 TO 4],"(***") THEN FLAG←0
ELSE IF EQU(S,NULL) THEN FLAG←0
ELSE IF EQU(S," ") THEN FLAG←0
ELSE FLAG←1; END;
RETURN (S); END;
PROC READCOMMENT(INTEGER I);
BEGIN IF EQU(SS[1 TO 7], "COMMENT") THEN BEGIN
WHILE ¬EQU(SS[2 TO 2],";") AND ¬EQU(SS[3 TO 3],";") AND ¬EOF1 AND ¬EOF2
DO SS←READIN(I);
SS←READIN(I);
END; END;
BOOLEAN PROC QCHECK(STRING S);
IF S="T" OR S="H" OR S="S" THEN RETURN (TRUE) ELSE RETURN (FALSE);
BOOLEAN PROC CHECK(STRING S);
BEGIN INTEGER I; I←LENGTH(S); IF I<2 THEN RETURN(FALSE);
IF I=2 AND EQU(S,"HE") THEN RETURN(TRUE) ;
IF I=3 AND (EQU(S,"HIS") OR EQU(S,"HIM") OR EQU(S,"HER") OR EQU(S,"SHE"))
THEN RETURN(TRUE) ;
IF I=4 AND (EQU(S,"THEM") OR EQU(S,"HERS")) THEN RETURN(TRUE);
IF (I=5 OR I=6) AND EQU(S[1 TO 5],"THEIR") THEN RETURN(TRUE);
RETURN(FALSE);
END;
FORMFEED← '14;
ZEROKS←"000000000000";
BLANKS←" ";
BLANK1←" ";
BLANK20←" ";
BLANK10←" ";
FLAG←0;
STDBRK(INCH);
DELIMSS← '15 & '12 & '40 & '11 & '14;
SETBREAK(13, '12 & '40, '15, "INS");
SETBREAK(14,DELIMSS & " ?.()","","INR");
SETBREAK(15,"αλ","","INR");
COMMENT BREAKSETS 17 AND 18 ARE RESERVED FOR TEMPORARY USE;
SW←0; J←0;
ITT(I,6) ITT(K,3) DUMMAA[I,K]←0;
ITT(I,5) SA[I]←" ";
COMMENT ********************************* ;
WHILE TRUE DO BEGIN "TOPBLOCK"
S←ASK("H FOR HELP -- GO?");
IF EQU(S, "X") THEN DONE "TOPBLOCK";
IF EQU(S, "H") THEN BEGIN
SAY("A for replAcing pronouns with THEY " ↓ );
SAY("B for inserting blank lines " ↓ );
SAY("C for making a list of topics from PDAT " ↓ );
SAY("D for deleting DIA files from DIA,KMC " ↓ );
SAY("G for appending files with file names " ↓ );
SAY("U for making a list of unused from SOR and TOPICS " ↓ );
SAY("I for making a list of stuff from PDAT for PDATB " ↓ );
SAY("P for going thru DIA files " ↓ );
SAY("S for going thru DIA files and collecting net stats " ↓ );
SAY("T for testing something" ↓ ↓ );
END; COMMENT END OF H ROUTINE;
COMMENT D ROUTINE FOR DELETING DIA FILES;
IF EQU(S,"D") THEN BEGIN "D"
SAY("Here we go deleting DIA files on DIA,KMC " ↓ );
FILIN("PAR2.FIL[DIA,KMC]");
SS←INPUT(INCH,1); IF EQU(SS,NULL) THEN SS←INPUT(INCH,1);
W←CVD(SS); RELEASE(INCH);
SAY("top number = " & CVS(W) ↓ );
SS←ASK("WANT TO DELETE NORMAL DIA FILES [Y,N]? ");
IF EQU(SS,"Y") THEN BEGIN "DEL"
SS←ASK("DELETE TO WHAT NUMBER [T FOR THRU.FIL]? ");
IF EQU(SS,"T") THEN BEGIN
FILIN("THRU.FIL[DIA,KMC]");
SS←INPUT(INCH,1); IF EQU(SS,NULL) THEN SS←INPUT(INCH,1);
W←CVD(SS); RELEASE(INCH); END
ELSE W←CVD(SS);
SAY("top number = " & CVS(W) ↓ );
FILIN("DEL.FIL[DIA,KMC]");
SS←INPUT(INCH,1); IF EQU(SS,NULL) THEN SS←INPUT(INCH,1);
J←CVD(SS); RELEASE(INCH);
SAY("bottom number = " & CVS(J) ↓ );
WHILE (J+1)≠W DO BEGIN "READDIA"
J←J+1;
SS←"P"&CVS(J)&".DIA[DIA,KMC]"; COMMENT SAY("reading from "& SS ↓ );
FLAG←0; FILIN(SS); I←FLAG;
IF I≠0 THEN SAY(SS& " doesnt exist" ↓ )
ELSE BEGIN SAY("deleting "&SS ↓ ); IDUM←0; RENAME(INCH,NULL,0,IDUM);
IF IDUM THEN SAY("DELETE FAILED!!" ↓ ); END;
RELEASE(INCH);
SAY("thru "&CVS(J) ↓ );
END "READDIA" ;
IF W≠(J+1) THEN J←J-1; COMMENT DIDN'T REALLY GET THRU JTH FILE;
FILOUT("DEL.FIL[DIA,KMC]"); OUT(OUCH,CVS(J) ↓ ); RELEASE(OUCH);
SAY("thru P" & CVS(J) ↓ );
SAY("done with deleting DIA files" ↓ );
END "DEL";
END "D" ;
COMMENT S ROUTINE FOR FOR GOING THRU DIA FILES AND COLLECTING NET STATS ;
IF EQU(S,"S") THEN BEGIN "S"
SETBREAK(17,'12 & '15 & "(","","INS"); COMMENT THIS SCANS UNTIL ( CRLF ;
SETBREAK(18,'12 & '15 & "?.()","","INS"); COMMENT THIS SCANS UNTIL ?.()CRLF ;
SAY("Here we go thru DIA files on DIA,KMC to collect net stats " ↓ );
FILIN("PAR2.FIL[DIA,KMC]");
SS←INPUT(INCH,1); IF EQU(SS,NULL) THEN SS←INPUT(INCH,1);
I←CVD(SS); RELEASE(INCH);
SAY("top number = " & CVS(I) ↓ );
FILIN("STATS.FIL[DIA,KMC]");
SS←INPUT(INCH,1); IF EQU(SS,NULL) THEN SS←INPUT(INCH,1);
J←CVD(SS); RELEASE(INCH);
SAY("bottom number = " & CVS(J) ↓ );
SS←ASK("Want to quit?"); IF EQU(SS,"Y") THEN DONE "TOPBLOCK";
LASTLINE←ASK("Tell me the dates ");
P←Q←0; COMMENT TO SAVE TIMES ;
WHILE (J+1)≠I DO BEGIN "READDIA"
J←J+1;
SS←"P"&CVS(J)&".DIA[DIA,KMC]"; SAY("reading "& SS ↓ );
FILIN(SS);
IF FLAG≠0 THEN BEGIN SAY(SS& " doesnt exist" ↓ ); CONTINUE "READDIA"; END;
SS←INPUT(INCH,1); ST←NULL; SS←INPUT(INCH,1);
WHILE ¬EOF DO BEGIN "READFILE"
WHILE ¬(NULL=SS) AND ¬(EQU(SS[1 TO 4],"NET ") OR EQU(SS[1 TO 7],"NONNET ")) DO
SU←SCAN(SS,17,IDUM);
IF SS THEN BEGIN SU←SCAN(SS,18,IDUM); ST←SU; END;
SS←INPUT(INCH,1);
END "READFILE" ;
COMMENT ******* OUT(OUCH,ST ↓ );
SAY("thru "&CVS(J) ↓ ); RELEASE(INCH);
IF EQU(ST[1 TO 6],"NONNET") THEN SU←ST[4 TO ∞] ELSE SU←ST;
K←CVD(SU[5 TO ∞]);
IF EQU(ST[1 TO 6],"NONNET") THEN P←P+K ELSE Q←Q+K; COMMENT P IS NONNET, Q IS NET;
END "READDIA" ;
IF I≠(J+1) THEN J←J-1; COMMENT DIDN'T REALLY GET THRU JTH FILE;
LASTLINE← LASTLINE&" NONNET= " & CVS(P/1000) & ", NET= " & CVS(Q/1000) &" IN SECS ";
FILIN("STATSR.FIL[DIA,KMC]"); SS←INPUT(INCH,1);
FILOUT("STATS9.FIL[DIA,KMC]");
WHILE NOT EOF DO BEGIN OUT(OUCH,SS ↓ ); SS←INPUT(INCH,1); END;
OUT(OUCH,LASTLINE ↓ ); RELEASE(OUCH);
RENAME(INCH,NULL,0,IDUM); IF IDUM THEN SAY("DELETE OF STATS.FIL FAILED" ↓ );
RELEASE(INCH);
FILIN("STATS9.FIL[DIA,KMC]"); RENAME(INCH,"STATSR.FIL[DIA,KMC]",0,IDUM); RELEASE(INCH);
IF IDUM THEN SAY("RENAME FAILED FOR STATS.FIL[DIA,KMC] " ↓ );
FILOUT("STATS.FIL[DIA,KMC]"); OUT(OUCH,CVS(J) ↓ ); RELEASE(OUCH);
SAY("thru P" & CVS(J) ↓ );
SAY("done with DIA files" ↓ );
END "S" ;
COMMENT U ROUTINE FOR GOING THRU SOR AND TOPICS FOR UNUSED ;
IF EQU(S,"U") THEN BEGIN "U"
INTEGER ARRAY IA[0:9999];
ITT(I,9999) IA[I]←0; IA[0]←0; J←0; COMMENT J IS THE HIGHEST NUMBER;
SAY("This goes thru SOR and TOPICS and looks for unused " ↓ );
SS←ASK("FILOUT="); FILOUT(SS);
FILENAME←ASK("FILIN[SOR]="); FILIN(FILENAME);
SS←READIN(1); READCOMMENT(1);
WHILE NOT EOF DO BEGIN "SOR"
SU←SCAN(SS,15,IDUM); IF SS THEN BEGIN SU←SS[2 TO 5]; I←CVD(SU); IA[I]←1;
IF I>J THEN J←I; END;
SS←READIN(1);
END "SOR" ; RELEASE(INCH); SAY("thru file1 " ↓ );
FILENAME←ASK("FILIN[TOPICS]="); FILIN(FILENAME);
SS←READIN(1); READCOMMENT(1);
WHILE NOT EOF DO BEGIN "TOPICS"
SU←SCAN(SS,15,IDUM); IF SS THEN BEGIN SU←SS[2 TO 5]; I←CVD(SU);
IA[I]←IA[I]+2; IF I>J THEN J←I; END;
SS←READIN(1);
END "TOPICS" ; RELEASE(INCH); SAY("thru file2 " ↓ );
SAY("highest number is " & CVS(J) ↓ );
OUT(OUCH,"IN SOR, NOT IN PDAT " ↓ ↓ );
ITT(I,J) IF IA[I]=1 THEN OUT(OUCH, "λ" & RIGHTZ(4,CVS(I)) ↓ );
OUT(OUCH, NULL ↓ );
OUT(OUCH,"IN PDAT, NOT IN SOR " ↓ ↓ );
ITT(I,J) IF IA[I]=2 THEN OUT(OUCH, "λ" & RIGHTZ(4,CVS(I)) ↓ );
RELEASE(OUCH);
END "U" ;
COMMENT I ROUTINE FOR GETTING THE IMPORTANT STUFF FROM PDAT ;
IF EQU(S,"I") THEN BEGIN "I"
SAY("This makes a list of stuff from PDAT for PDATB " ↓ );
FILENAME←ASK("FILIN="); FILIN(FILENAME);
SS←ASK("FILOUT="); FILOUT(SS);
SETBREAK(17,'12 & '15 & "?.()","","INR"); COMMENT THIS SCANS UNTIL ?.()CRLF ;
SS←INPUT(INCH,1);
READCOMMENT(1);
WHILE NOT EOF DO BEGIN
ST←NULL;
IF EQU("(#B λ", SS[1 TO 5]) THEN BEGIN
SU←INPUT(INCH,1);
IF EQU(SU[2 TO 5],"PRED") THEN
ST←"(DEFPROP " & SS[5 TO 10] & SU[7 TO ∞] & " UNIT)"
ELSE IF EQU(SU[2 TO 6],"CLASS") THEN
ST←"(DEFPROP " & SU[8 TO ∞] & SS[4 TO 9] & " IND)";
IF ¬EQU(ST,NULL) THEN OUT(OUCH,ST ↓ );
END;
SS←INPUT(INCH,1);
END;
RELEASE(OUCH); RELEASE(INCH);
END "I" ;
COMMENT C ROUTINE FOR GETTING A LIST OF TOPICS FROM PDAT ;
IF EQU(S,"C") THEN BEGIN "C"
SAY("This makes a list of bondvalues and topics from PDAT " ↓ );
FILENAME←ASK("FILIN="); FILIN(FILENAME);
SS←ASK("FILOUT="); FILOUT(SS);
SETBREAK(17,'12 & '15 & "?.()","","INR"); COMMENT THIS SCANS UNTIL ?.()CRLF ;
SS←INPUT(INCH,1);
READCOMMENT(1);
WHILE NOT EOF DO BEGIN
IF EQU("(#B λ", SS[1 TO 5]) THEN BEGIN SAY(SS ↓ );
SU←SS[5 TO ∞]; ST←SCAN(SU,17,IDUM); ST← SS[5 TO 9] & " " & SU;
SS←INPUT(INCH,1); IF ¬EQU(SS[2 TO 6],"TOPIC") THEN SS←INPUT(INCH,1);
IF ¬EQU(SS[2 TO 6],"TOPIC") THEN SAY("ERROR " & ST ↓ );
SU←SCAN(SS,17,IDUM);
I←LENGTH(SS); IF I<8 THEN SU← '11 & '11 & '11 ELSE IF I<16 THEN SU← '11 & '11
ELSE SU←'11;
ST←SS & SU & ST; COMMENT (HOSPITAL) λ1112 (LOC I HOSP) ;
OUT(OUCH,ST ↓ );
END;
SS←INPUT(INCH,1);
END;
RELEASE(OUCH); RELEASE(INCH);
END "C" ;
COMMENT P ROUTINE FOR FOR GOING THRU DIA FILES;
IF EQU(S,"P") THEN BEGIN "P"
SAY("Here we go thru DIA files on DIA,KMC " ↓ );
FILIN("PAR2.FIL[DIA,KMC]");
SS←INPUT(INCH,1); IF EQU(SS,NULL) THEN SS←INPUT(INCH,1);
I←CVD(SS); RELEASE(INCH);
SAY("top number = " & CVS(I) ↓ );
FILIN("THRU.FIL[DIA,KMC]");
SS←INPUT(INCH,1); IF EQU(SS,NULL) THEN SS←INPUT(INCH,1);
J←CVD(SS); RELEASE(INCH);
SAY("bottom number = " & CVS(J) ↓ );
SS←ASK("Want to quit?"); IF EQU(SS,"Y") THEN DONE "TOPBLOCK";
FILIN("OUT.FIL[DIA,KMC]");
SS←INPUT(INCH,1); IF EQU(SS,NULL) THEN SS←INPUT(INCH,1);
K←CVD(SS); RELEASE(INCH);
FILOUT("OUT.FIL[DIA,KMC]"); OUT(OUCH,CVS(K+1) ↓ ); RELEASE(OUCH);
SS←"S" & CVS(K) & ".OUT[DIA,KMC]"; SAY("writing out on "&SS ↓ ); FILOUT(SS);
WHILE (J+1)≠I DO BEGIN "READDIA"
J←J+1;
SS←"P"&CVS(J)&".DIA[DIA,KMC]"; SAY("reading from "& SS ↓ );
FILIN(SS);
IF FLAG≠0 THEN BEGIN SAY(SS& " doesnt exist" ↓ ); CONTINUE "READDIA"; END;
SS←INPUT(INCH,1); ST←NULL;
WHILE ¬EOF DO BEGIN "READFILE"
SV←ST; ST←SU←NULL;
WHILE ¬EOF AND EQS(SS) DO SS←INPUT(INCH,1);
WHILE ¬EOF AND ¬EQS(SS) AND EQU(ST,NULL) DO
BEGIN ST←SU; SU←SS; SS←INPUT(INCH,1); END;
COMMENT NOW HAVE INPUT IN ST, OUTPUT IN SU, PREVIOUS INPUT IN SV;
SAY(ST ↓ ); S1←ST; S←NULL;
SAY(SU ↓ ↓ );
IF EQU(ST,NULL) OR EQU(ST[1 TO 2],"PD") THEN SAY("ignore this " ↓ )
ELSE S←ASK("do what? ");
IF EQU(S,"H") THEN
BEGIN SAY("Copy, Enter sentence, Previous sent, Done with Dialog, Xit" ↓ );
S←ASK("do what?"); END;
IF EQU(S,"X") THEN DONE "READDIA";
IF EQU(S,"D") THEN DONE "READFILE";
IF EQU(S,"E") THEN S1←ASK("type in the new sentence ");
IF EQU(S,"O") THEN BEGIN LODED(SV ↓ ); S1←ASK("edit ") END;
IF EQU(S,"V") THEN BEGIN LODED(S1 ↓ ); S1←ASK("edit ") END;
IF EQU(S,"P") THEN S1←SV;
IF EQU(S,"E") OR EQU(S,"P") OR EQU(S,"C") OR EQU(S,"V") OR EQU(S,"O") THEN
OUT(OUCH, S1 ↓ );
END "READFILE" ;
SAY("thru "&CVS(J) ↓ ); RELEASE(INCH);
END "READDIA" ;
IF I≠(J+1) THEN J←J-1; COMMENT DIDN'T REALLY GET THRU JTH FILE;
RELEASE(OUCH);
FILOUT("THRU.FIL[DIA,KMC]"); OUT(OUCH,CVS(J) ↓ ); RELEASE(OUCH);
SAY("thru P" & CVS(J) ↓ );
SAY("done with DIA files" ↓ );
END "P" ;
COMMENT A ROUTINE FOR REPLACING PRONOUNS BY "THEY" ;
IF EQU(S,"A") THEN BEGIN "A"
SAY("This replaces pronouns by THEY " ↓ );
SAY("pronouns replaced are HE HIM HIS HER SHE HERS THEIR THEM " ↓ );
FILENAME←ASK("FILIN="); FILIN(FILENAME);
SS←ASK("FILOUT="); FILOUT(SS);
SS←INPUT(INCH,1); READCOMMENT(1);
WHILE NOT EOF DO BEGIN "REPLACE"
ST←NULL;
SV←SCAN(SS,5,IDUM);
WHILE SS DO BEGIN "LINE"
SU←SCAN(SS,14,IDUM);
IF QCHECK(SU[1 TO 1]) AND CHECK(SU) THEN ST←ST&" THEY" ELSE ST←ST&" "&SU;
SU←SCAN(SS,5,IDUM);
END "LINE" ;
IF ¬EQU(ST,NULL) THEN ST←ST&". ";
OUT(OUCH,ST ↓ );
SS←INPUT(INCH,1);
END "REPLACE" ;
RELEASE(OUCH); RELEASE(INCH);
END "A" ;
COMMENT G ROUTINE FOR APPENDING FILES ;
IF EQU(S,"G") THEN BEGIN "G"
SAY("This appends files and adds the name and comments to the first line " ↓ );
SS←ASK("FILOUT=");
FILOUT(SS);
FILENAME←ASK("FILIN (CR FOR END)= ");
WHILE FILENAME DO BEGIN "READFILE"
SAY("reading from "&FILENAME ↓ );
FILIN(FILENAME);
OUT(OUCH,FILENAME ↓ ↓ );
SS←READIN(INCH);
WHILE ¬EOF DO BEGIN "READLINE"
OUT(OUCH,SS ↓ );
SS←READIN(INCH);
END "READLINE";
OUT( OUCH, '15 & '14 ); COMMENT CR AND FORM FEED;
SAY("done with "&FILENAME ↓ );
RELEASE(INCH);
FILENAME←ASK("FILIN (CR FOR END)= ");
END "READFILE" ;
RELEASE(OUCH);
END "G" ;
COMMENT B ROUTINE FOR SPECIAL MOD: PUTS IN BLANK LINES;
IF EQU(S,"B") THEN BEGIN "B"
SAY("This inserts a blank line between groups of lines which begin with" ↓ );
SAY(" the same first 6 characters: (λ1234 in an ANS file " ↓ );
FILENAME←ASK("FILIN="); FILIN(FILENAME);
SS←ASK("FILOUT="); FILOUT(SS);
SS←READIN(1); READCOMMENT(1);
WHILE NOT EOF DO BEGIN
OUTB(OUCH,SS ↓ );
SS←READIN(1);
END;
RELEASE(OUCH); RELEASE(INCH);
END "B" ;
COMMENT " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *";
COMMENT T ROUTINE FOR TESTING THINGS;
IF EQU(S,"T") THEN BEGIN
END; COMMENT END OF S=T;
END "TOPBLOCK" ; COMMENT END TO INFINITE LOOP;
COMMENT END OF PROGRAM;
END;